'use strict';

App.service('Page', ['$http', '$state', function($http, $state) { // injectables go here
	var self = this; // Save reference

	this.alert = function(message, okCallback) {
		layer.alert(message, function(index) {
			// do something
			if (okCallback) {
				okCallback();
			}
			layer.close(index);
		});
	};

	this.notice = function(message) {
		layer.msg(message);
	};

	this.confirm = function(message, okCallback) {
		layer.confirm(message, {
			icon : 3,
			title : '提示'
		}, function(index) {
			if (okCallback) {
				okCallback();
			}
			layer.close(index);
		});
	};

	this.ajax = function(method, url, data, isFilter, callback, errorCallback) {
		// 加上时间戳，避免浏览器缓存
		url = url += (url.indexOf('?') > 0 ? '&' : '?') + '_t=' + (new Date()).valueOf();
		var loadi = null;
		if (isFilter) {
			loadi = layer.load(0);
		}
		$http({
			method : method,
			url : url,
			data : data,
			cache : false
		}).success(function(response) {
			if (loadi != null) {
				layer.close(loadi);
			}
			if (response.resultCode == '1' || url.indexOf('service/') == 0) { //成功
				if (callback) {
					callback(response);
				}
			} else if (errorCallback) {
				errorCallback(response)
			} else if (response.resultCode) {
				self.notice(response.resultDes);
			}
		}).error(function(response) {
			if (loadi != null) {
				layer.close(loadi);
			}
		});
	};

	this.ajaxPost = function(url, data, callback, errorCallback) {
		this.ajax('POST', url, data, true, callback, errorCallback);
	};

	this.ajaxPostQuiet = function(url, data, callback, errorCallback) {
		this.ajax('POST', url, data, false, callback, errorCallback);
	};

	this.ajaxGet = function(url, data, callback, errorCallback) {
		this.ajax('GET', url, data, true, callback, errorCallback);
	};

	this.ajaxGetQuiet = function(url, data, callback, errorCallback) {
		this.ajax('GET', url, data, false, callback, errorCallback);
	};

	this.ajaxPut = function(url, data, callback, errorCallback) {
		if (!data) {
			data = {};
		}
		data._method = 'PUT';
		this.ajaxPost(url, data, callback, errorCallback);
	},

	this.ajaxDelete = function(url, data, callback, errorCallback) {
		if (!data) {
			data = {};
		}
		data._method = 'DELETE';
		this.ajaxPost(url, data, callback, errorCallback);
	}

}]);

App.service('Form',[function() { // injectables go here

	this.toJson = function(formid, params) {
		if (!params) {
			params = {};
		}
		if (!formid) {
			return params;
		}
		var form = $(formid);
		var paramArray = form.serializeArray();
		$(paramArray).each(function() {
			params[this.name] = this.value;
		});

		// checkbox
		form.find("input[type='checkbox']").each(function() {
			var name = $(this).attr("name");
			params[name] = $(this).prop("checked") ? "1" : "0";
		});
		return params;
	};
	this.toJson2 = function(formid, params) {
		if (!params) {
			params = {};
		}
		if (!formid) {
			return params;
		}

		var form = $(formid);
		var paramArray = form.serializeArrayUnNull();
		$(paramArray).each(function() {
			if(params[this.name] !== undefined){
				if(!params[this.name].push){
					params[this.name] = [params[this.name]];
				}
				params[this.name].push(this.value || '');
			}else{
				params[this.name] = this.value || '';
			}
		});

		// checkbox
		form.find("input[type='checkbox']").each(function() {
			var name = $(this).attr("name");
			var value = $(this).prop("checked") ? "1" : "0";

			if(params[name] !== undefined){
				if(!params[name].push){
					params[name] = [params[name]];
				}
				params[name].push(value || '');
			}else{
				params[name] = value || '';
			}
		});
		return params;
	};

}]);

App.service('XCode',['$rootScope','Page', function($rootScope, Page) {

	// var options = {};

	this.init = function() {
		Page.ajaxPostQuiet('system/codes.do', null, function(response) {
			$rootScope.options = response.data;
		});
	}

	this.queryCodes = function(url, param, callback) {
		Page.ajaxPostQuiet(url, param, function(response) {
			var code = url;
			if (param) {
				code += angular.toJson(param);
			}
			$rootScope.options[code] = response.data;
			if (callback) {
				callback(response.data);
			}
		});
	}

	this.getName = function(codeType, value) {
		var name = value;
		$($rootScope.options[codeType]).each(function(index, option) {
			if (option.value == value) {
				name = option.name;
				return false;// break
			}
		});
		return name;
	};
	this.getSelectOption = function(codeType) {
		var options = $rootScope.options[codeType];
		if (!options) {
			options = [];
		}
		return options;
	}
}]);

App.service('Auth', ['$rootScope', function($rootScope) {

	this.validate = function(code) {
		var permission = $rootScope.user.permission[$rootScope.menuId || ''],
			permissionDeny = $rootScope.user.permissionDeny[$rootScope.menuId || ''];
		if (code && (permission || permissionDeny)) {
			if ((',' + permission + ',').indexOf(',' + code + ',') < 0
				&& (',' + permissionDeny + ',').indexOf(',' + code + ',') >= 0) {
				return false;
			}
		}
		return true;
	}

}]);

var Ztree = function () {

	return {

		// 取消选择
		unCheckAllNodes: function(dest) {
			dest.setting.view.expandSpeed = "";
			//dest.checkAllNodes(false);
			// 取消勾选的
			var checkedNodes = dest.getCheckedNodes(true), checkedLen = checkedNodes.length;
			if (checkedLen > 0) {
				for (var i = 0; i < checkedLen; i++) {
					dest.checkNode(checkedNodes[i], false);
				}
			}
			// 取消所有选择
			dest.cancelSelectedNode();

			dest.expandAll(false);
			dest.setting.view.expandSpeed = "fast";
		},

		// 选择节点
		checkNodes: function(dest, nodes, idKey) {
			$(nodes).each(function(index, node) {
				if (idKey) {
					node = dest.getNodeByParam(idKey, node[idKey], null);
				}
				if (node && !node.isParent) {
					dest.checkNode(node, true, true);
				}
			});
			// 展开所有选中节点
			var checkedNodes = dest.getCheckedNodes(true), checkedLen = checkedNodes.length;
			if (checkedLen > 0) {
				for (var i = 0; i < checkedLen; i++) {
					dest.expandNode(checkedNodes[i], true);
				}
			}
		},

		// 获取nodes2相对于nodes1减少的
		difference: function(nodes1, nodes2, idKey) {
			var ids = ',';
			$(nodes2).each(function(index, node) {
				ids += node[idKey] + ',';
			});
			var nodes = [];
			$(nodes1).each(function(index, node) {
				if (ids.indexOf(',' + node[idKey] + ',') < 0) {
					nodes.push(node);
				}
			});
			return nodes;
		},

		ids: function(nodes, idKey) {
			var ids = [];
			$(nodes).each(function(index, node) {
				ids.push(node[idKey]);
			});
			return ids;
		},

		search: function(tree, key, value, filter) {
			var nodes = tree.getNodesByParamFuzzy('highlight', '1');
			if(nodes && nodes.length > 0) {
				$(nodes).each(function (index, node) {
					node.highlight = '0';
					tree.updateNode(node);
				});
				// 展开根节点
				Ztree.expandRoot(tree);
			}
			if (value) {
				nodes = tree.getNodesByParamFuzzy(key, value);
				if(nodes && nodes.length > 0) {
					$(nodes).each(function(index, node) {
						if (!filter || filter(node)) {
							node.highlight = '1';
							tree.updateNode(node);
							Ztree.expandNode(tree, node, true);
						}
					});
				}
			}
		},

		expandNode: function(tree, node, expandFlag) {
			var parentNode = node.getParentNode();
			if (parentNode) {
				tree.expandNode(parentNode, expandFlag, false, false);
				return Ztree.expandNode(tree, parentNode, expandFlag);
			}
		},

		expandRoot: function(tree) {
			if (tree) {
				tree.setting.view.expandSpeed = "";
				tree.expandAll(false);
				// 根节点展开
				var roots = tree.getNodesByFilter(function (node) { return node.level == 0 });
				$(roots).each(function(index, node) {
					tree.expandNode(node, true, false, false);
				});
				tree.setting.view.expandSpeed = "fast";
			}
		},

		getRootParent: function(node) {
			var parentNode = node.getParentNode();
			if (parentNode) {
				return Ztree.getRootParent(parentNode);
			} else {
				return node;
			}
		},

		getData: function(item) {
			item = angular.copy(item);

			if (item) {
				delete item.children;
				delete item.tId;
				delete item.parentTId;
				delete item.open;
				//delete item.isParent;
				delete item.zAsync;
				delete item.isFirstNode;
				delete item.isLastNode;
				delete item.isAjaxing;
				delete item.checked;
				delete item.checkedOld;
				delete item.nocheck;
				delete item.chkDisabled;
				delete item.halfCheck;
				delete item.check_Child_State;
				delete item.check_Focus;

				delete item.getCheckStatus;
				delete item.getNextNode;
				delete item.getParentNode;
				delete item.getPreNode;
			}

			return item;
		}
	}

}();

var AppUtil = function () {

	return {

		// 获取model的小数点最后部分
		getModelName: function(modelName) {
			if (modelName.indexOf('.') > 0) {
				modelName = modelName.substring(modelName.lastIndexOf('.') + 1, modelName.length);
			}
			return modelName;
		},

		// 获取model的小数点最后部分
		getModelValue: function(scope, modelName) {
			if (modelName.indexOf('.') > 0) {
				var arr = modelName.split('.');
				var value = scope;
				$(arr).each(function(ii, modelName2) {
					if (angular.isUndefined(value)) {
						value = null;
						return false;
					} else {
						value = value[modelName2];
					}
				});
				return value;
			} else {
				return scope[modelName];
			}
		},

		jsonfy: function(json) {
			//return jsonfy('{' + (json || '') + '}');
			return eval('[{' + (json || '') + '}]')[0];
		}
	}

}();